<?php
namespace app\model;

class LoginFailure extends BaseModel
{
    // 设置表名
    protected $name = 'login_failures';
    
    // 自动时间戳
    protected $autoWriteTimestamp = true;

    // 字段类型转换
    protected $type = [
        'attempt_time' => 'integer',
        'lock_until' => 'integer',
        'created_at' => 'integer',
        'updated_at' => 'integer',
        'delete_time' => 'integer'
    ];

    /**
     * 检查账号是否被锁定
     * @param string $email 邮箱
     * @return bool|array 未锁定返回false，锁定返回锁定信息
     */
    public static function checkAccountLock($email)
    {
        $now = time();
        
        // 检查是否存在未过期的锁定记录
        $lock = self::where('email', $email)
            ->where('lock_until', '>', $now)
            ->order('lock_until', 'desc')
            ->find();

        if ($lock) {
            return [
                'locked' => true,
                'lock_until' => $lock->lock_until,
                'remaining_time' => $lock->lock_until - $now
            ];
        }

        return false;
    }

    /**
     * 检查IP是否被锁定
     * @param string $ip IP地址
     * @return bool|array 未锁定返回false，锁定返回锁定信息
     */
    public static function checkIpLock($ip)
    {
        $now = time();
        
        // 检查是否存在未过期的锁定记录
        $lock = self::where('ip_address', $ip)
            ->where('lock_until', '>', $now)
            ->order('lock_until', 'desc')
            ->find();

        if ($lock) {
            return [
                'locked' => true,
                'lock_until' => $lock->lock_until,
                'remaining_time' => $lock->lock_until - $now
            ];
        }

        return false;
    }

    /**
     * 清除过期的失败记录
     */
    public static function clearExpiredRecords()
    {
        $twoDaysAgo = time() - (86400 * 2); // 2天前
        self::where('attempt_time', '<', $twoDaysAgo)->delete();
    }

    /**
     * 清除指定账号的失败记录
     * @param string $email 邮箱
     */
    public static function clearAccountRecords($email)
    {
        self::where('email', $email)->delete();
    }

    /**
     * 获取指定时间段内的失败次数
     * @param string $email 邮箱
     * @param int $startTime 开始时间
     * @return int
     */
    public static function getFailureCount($email, $startTime)
    {
        return self::where('email', $email)
            ->where('attempt_time', '>', $startTime)
            ->count();
    }

    /**
     * 获取IP失败次数
     * @param string $ip IP地址
     * @param int $startTime 开始时间
     * @return int
     */
    public static function getIpFailureCount($ip, $startTime)
    {
        return self::where('ip_address', $ip)
            ->where('attempt_time', '>', $startTime)
            ->count();
    }

    /**
     * 关联用户模型
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
} 